package fr.charlott.business.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.dozer.DozerBeanMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import fr.charlott.business.dto.PersonneDTO;
import fr.charlott.business.service.PersonneService;
import fr.charlott.core.repository.model.Personne;

@Service("personneService")
public class PersonneServiceImpl implements PersonneService {

	private fr.charlott.core.service.PersonneService personneService;

	private DozerBeanMapper dozerMapper;

	public PersonneServiceImpl() {
		super();
	}

	@Autowired
	public PersonneServiceImpl(fr.charlott.core.service.PersonneService personneService, DozerBeanMapper dozerMapper) {
		this();
		this.personneService = personneService;
		this.dozerMapper = dozerMapper;
	}

	@Override
	public PersonneDTO chercherParId(Long id) {
		Personne personne = personneService.chercherParId(id);
		if (personne != null) {
			return dozerMapper.map(personne, PersonneDTO.class);
		}
		return null;
	}

	@Override
	@Transactional(readOnly = true)
	public List<PersonneDTO> chargerToutesLesPersonnes() {
		List<PersonneDTO> listePersonnes = new ArrayList<PersonneDTO>();
		for (Personne personne : personneService.chargerToutesLesPersonnes()) {
			listePersonnes.add(dozerMapper.map(personne, PersonneDTO.class));
		}
		return listePersonnes;
	}
	
	@Override
	@Transactional(readOnly = true)
	public List<PersonneDTO> chargerProchainesVisites(Date dateFrom, Date dateTo) {
		List<PersonneDTO> listePersonnes = new ArrayList<PersonneDTO>();
		List<Personne> personnes = personneService.chargerProchainesVisites(dateFrom, dateTo);
		for (Personne personne : personnes) {
			listePersonnes.add(dozerMapper.map(personne, PersonneDTO.class));
		}
		return listePersonnes;
	}
	
	@Override
	@Transactional(readOnly = true)
	public List<PersonneDTO> chargerTousLesAnniversaires() {
		List<PersonneDTO> listePersonnes = new ArrayList<PersonneDTO>();
		for (Personne personne : personneService.chargerTousLesAnniversaires()) {
			listePersonnes.add(dozerMapper.map(personne, PersonneDTO.class));
		}
		return listePersonnes;
	}
	
	@Override
	@Transactional
	public void supprimerToutesLesPersonnes(){
		personneService.supprimerToutesLesPersonnes();
	}
	
	// getters - setters

	/**
	 * @param dozerMapper
	 *            the dozerMapper to set
	 */
	public void setDozerMapper(DozerBeanMapper dozerMapper) {
		this.dozerMapper = dozerMapper;
	}

	/**
	 * @param personneService
	 *            the personneService to set
	 */
	@Override
	public void setPersonneService(fr.charlott.core.service.PersonneService personneService) {
		this.personneService = personneService;
	}

}
